package com.ihy.service.impl;

import com.ihy.entity.Mail;
import com.ihy.service.ServiceMail;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Date;

@Slf4j
@Service
public class ServiceMailImpl implements ServiceMail {

    /**
     * Spring Boot 提供了一个发送邮件的简单抽象，使用的是下面这个接口，这里直接注入即可使用
     */
    @Autowired
    private JavaMailSender mailSender;

    /**
     * 配置文件中我的qq邮箱
     */
    @Value("${spring.mail.username}")
    private String sender;

    /**
     * 简单文本邮件
     *
     * @param mail 邮件对象
     */
    @Override
    public void sendSimpleMail(Mail mail) {
        //创建SimpleMailMessage对象
        SimpleMailMessage message = new SimpleMailMessage();
        //邮件发送人
        message.setFrom(sender);
        //邮件接收人
        message.setTo(mail.getReceiver());
        //邮件主题
        message.setSubject(mail.getSubject());
        // 设置邮件发送日期
        message.setSentDate(new Date());
        //抄送：将邮件同时送给收信人以外的人，用户所写的邮件抄送一份给别人,对方可以看见该用户的E-mail发送给了谁。
        if (mail.getCcTo() != null) message.setCc(mail.getCcTo());
        // 密送：将邮件同时送给收信人以外的人，用户所写的邮件抄送一份给别人,但是对方不能查看到这封邮件同时还发送给了哪些人。
        if (mail.getCcPerson() != null) message.setBcc(mail.getCcPerson());
        //邮件内容
        message.setText(mail.getContent());
        //发送邮件
        mailSender.send(message);
    }

    /**
     * html邮件
     *
     * @param mail 邮件对象
     */
    @Override
    public void sendHtmlMail(Mail mail) {
        //获取MimeMessage对象
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message, true);
            //邮件发送人
            messageHelper.setFrom(sender);
            //邮件接收人
            messageHelper.setTo(mail.getReceiver());
            //邮件主题
            message.setSubject(mail.getSubject());
            // 设置邮件发送日期
            message.setSentDate(new Date());
            //抄送：将邮件同时送给收信人以外的人，用户所写的邮件抄送一份给别人,对方可以看见该用户的E-mail发送给了谁。
            if (mail.getCcTo() != null) messageHelper.setCc(mail.getCcTo());
            // 密送：将邮件同时送给收信人以外的人，用户所写的邮件抄送一份给别人,但是对方不能查看到这封邮件同时还发送给了哪些人。
            if (mail.getCcPerson() != null) messageHelper.setBcc(mail.getCcPerson());
            //邮件内容，html格式
            messageHelper.setText(mail.getContent(), true);
            //发送
            mailSender.send(message);
            //日志信息
            log.info("邮件已经发送到 [{}]", (Object) mail.getReceiver());
        } catch (MessagingException e) {
            log.error("发送邮件时发生异常！", e);
        }
    }

    /**
     * 带附件的邮件
     *
     * @param mail 邮件对象
     */
    @Override
    public void sendAttachmentsMail(Mail mail) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            //发送人
            helper.setFrom(sender);
            //收件人
            helper.setTo(mail.getReceiver());
            //邮件主题
            helper.setSubject(mail.getSubject());
            //抄送：将邮件同时送给收信人以外的人，用户所写的邮件抄送一份给别人,对方可以看见该用户的E-mail发送给了谁。
            if (mail.getCcTo() != null) helper.setCc(mail.getCcTo());
            // 密送：将邮件同时送给收信人以外的人，用户所写的邮件抄送一份给别人,但是对方不能查看到这封邮件同时还发送给了哪些人。
            if (mail.getCcPerson() != null) helper.setBcc(mail.getCcPerson());
            // 设置邮件发送日期
            message.setSentDate(new Date());
            helper.setText(mail.getContent(), true);
            FileSystemResource file = new FileSystemResource(new File(mail.getFilePath()));
            String fileName = mail.getFilePath().substring(mail.getFilePath().lastIndexOf(File.separator));
            helper.addAttachment(fileName, file);
            mailSender.send(message);
            //日志信息
            log.info("邮件已经发送到 [{}]", (Object) mail.getReceiver());
        } catch (MessagingException e) {
            log.error("发送邮件时发生异常！", e);
        }
    }
}